package cn.iocoder.yudao.module.im.api.status;

import cn.iocoder.yudao.module.im.api.status.dto.UserStatusDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import static cn.iocoder.yudao.module.im.api.status.UserStatusApiConstants.*;

/**
 * 用户在线状态服务的 Feign 接口
 *
 * @author 芋道源码
 */
@FeignClient(value = USER_STATUS_SERVICE, contextId = "userStatus")
public interface UserStatusService {

    /**
     * 设置用户在线状态
     *
     * @param userId 用户ID
     * @param status 在线状态
     * @param deviceId 设备ID
     * @return 用户在线状态ID
     */
    @PostMapping(SET_USER_STATUS)
    Long setUserStatus(@RequestParam("userId") Long userId, @RequestParam("status") Integer status, 
                      @RequestParam("deviceId") String deviceId);

    /**
     * 获取用户在线状态
     *
     * @param userId 用户ID
     * @return 用户在线状态
     */
    @GetMapping(GET_USER_STATUS)
    UserStatusDTO getUserStatus(@RequestParam("userId") Long userId);

    /**
     * 获取用户在特定设备上的在线状态
     *
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @return 用户在线状态
     */
    @GetMapping(GET_USER_STATUS_BY_DEVICE)
    UserStatusDTO getUserStatusByDeviceId(@RequestParam("userId") Long userId, @RequestParam("deviceId") String deviceId);

    /**
     * 获取用户的所有设备状态
     *
     * @param userId 用户ID
     * @return 用户在线状态列表
     */
    @GetMapping(GET_USER_ALL_DEVICES)
    List<UserStatusDTO> getUserAllDeviceStatus(@RequestParam("userId") Long userId);

    /**
     * 更新用户最后活跃时间
     *
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @return 是否更新成功
     */
    @PutMapping(UPDATE_LAST_ACTIVE_TIME)
    Boolean updateLastActiveTime(@RequestParam("userId") Long userId, @RequestParam("deviceId") String deviceId);

    /**
     * 下线用户
     *
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @return 是否下线成功
     */
    @PostMapping(OFFLINE_USER)
    Boolean offlineUser(@RequestParam("userId") Long userId, @RequestParam("deviceId") String deviceId);

}